module MYMAC(
  input         clock,
  input         reset,
  input  [7:0]  io_macIO_dataIn,
  input  [31:0] io_macIO_accIn,
  input         io_macIO_switchw,
  input  [7:0]  io_macIO_weightIn,
  input         io_macIO_weightWe,
  input  [7:0]  io_macIO_weightTag,
  output [31:0] io_macIO_outDelay,
  output [7:0]  io_macIO_dataDelay,
  output        io_macIO_switchDelay,
  output [7:0]  io_macIO_weightDelay,
  output        io_macIO_weightWeDelay,
  output [7:0]  io_macIO_weightTagDelay
);
`ifdef RANDOMIZE_REG_INIT
  reg [31:0] _RAND_0;
  reg [31:0] _RAND_1;
  reg [31:0] _RAND_2;
  reg [31:0] _RAND_3;
  reg [31:0] _RAND_4;
  reg [31:0] _RAND_5;
  reg [31:0] _RAND_6;
  reg [31:0] _RAND_7;
  reg [31:0] _RAND_8;
`endif // RANDOMIZE_REG_INIT
  reg [7:0] wbuf1; // @[MAC.scala 45:29]
  reg [7:0] wbuf2; // @[MAC.scala 45:29]
  reg  currentBufferReg; // @[MAC.scala 46:33]
  wire  currenBuffer = currentBufferReg ^ io_macIO_switchw; // @[MAC.scala 51:39]
  wire  _T_2 = ~currenBuffer; // @[MAC.scala 54:22]
  wire [7:0] weight = _T_2 ? $signed(wbuf2) : $signed(wbuf1); // @[MAC.scala 61:19]
  wire [15:0] product = $signed(weight) * $signed(io_macIO_dataIn); // @[MAC.scala 62:24]
  wire [31:0] _GEN_5 = {{16{product[15]}},product}; // @[MAC.scala 63:21]
  wire [31:0] out = $signed(_GEN_5) + $signed(io_macIO_accIn); // @[MAC.scala 63:21]
  reg [7:0] io_macIO_dataDelay_REG; // @[MAC.scala 65:32]
  reg  io_macIO_switchDelay_REG; // @[MAC.scala 66:34]
  reg [31:0] io_macIO_outDelay_REG; // @[MAC.scala 67:31]
  reg [7:0] io_macIO_weightDelay_REG; // @[MAC.scala 68:34]
  reg  io_macIO_weightWeDelay_REG; // @[MAC.scala 69:36]
  wire [7:0] _io_macIO_weightTagDelay_T_1 = io_macIO_weightTag + 8'h1; // @[MAC.scala 70:58]
  reg [7:0] io_macIO_weightTagDelay_REG; // @[MAC.scala 70:37]
  assign io_macIO_outDelay = io_macIO_outDelay_REG; // @[MAC.scala 67:21]
  assign io_macIO_dataDelay = io_macIO_dataDelay_REG; // @[MAC.scala 65:22]
  assign io_macIO_switchDelay = io_macIO_switchDelay_REG; // @[MAC.scala 66:24]
  assign io_macIO_weightDelay = io_macIO_weightDelay_REG; // @[MAC.scala 68:24]
  assign io_macIO_weightWeDelay = io_macIO_weightWeDelay_REG; // @[MAC.scala 69:26]
  assign io_macIO_weightTagDelay = io_macIO_weightTagDelay_REG; // @[MAC.scala 70:27]
  always @(posedge clock) begin
    if (reset) begin // @[MAC.scala 45:29]
      wbuf1 <= 8'sh0; // @[MAC.scala 45:29]
    end else if (io_macIO_weightWe & io_macIO_weightTag == 8'h2) begin // @[MAC.scala 53:67]
      if (!(~currenBuffer)) begin // @[MAC.scala 54:29]
        wbuf1 <= io_macIO_weightIn; // @[MAC.scala 57:13]
      end
    end
    if (reset) begin // @[MAC.scala 45:29]
      wbuf2 <= 8'sh0; // @[MAC.scala 45:29]
    end else if (io_macIO_weightWe & io_macIO_weightTag == 8'h2) begin // @[MAC.scala 53:67]
      if (~currenBuffer) begin // @[MAC.scala 54:29]
        wbuf2 <= io_macIO_weightIn; // @[MAC.scala 55:13]
      end
    end
    if (reset) begin // @[MAC.scala 46:33]
      currentBufferReg <= 1'h0; // @[MAC.scala 46:33]
    end else if (io_macIO_switchw) begin // @[MAC.scala 47:25]
      currentBufferReg <= ~currentBufferReg; // @[MAC.scala 48:22]
    end
    if (reset) begin // @[MAC.scala 65:32]
      io_macIO_dataDelay_REG <= 8'sh0; // @[MAC.scala 65:32]
    end else begin
      io_macIO_dataDelay_REG <= io_macIO_dataIn; // @[MAC.scala 65:32]
    end
    if (reset) begin // @[MAC.scala 66:34]
      io_macIO_switchDelay_REG <= 1'h0; // @[MAC.scala 66:34]
    end else begin
      io_macIO_switchDelay_REG <= io_macIO_switchw; // @[MAC.scala 66:34]
    end
    if (reset) begin // @[MAC.scala 67:31]
      io_macIO_outDelay_REG <= 32'sh0; // @[MAC.scala 67:31]
    end else begin
      io_macIO_outDelay_REG <= out; // @[MAC.scala 67:31]
    end
    if (reset) begin // @[MAC.scala 68:34]
      io_macIO_weightDelay_REG <= 8'sh0; // @[MAC.scala 68:34]
    end else begin
      io_macIO_weightDelay_REG <= io_macIO_weightIn; // @[MAC.scala 68:34]
    end
    if (reset) begin // @[MAC.scala 69:36]
      io_macIO_weightWeDelay_REG <= 1'h0; // @[MAC.scala 69:36]
    end else begin
      io_macIO_weightWeDelay_REG <= io_macIO_weightWe; // @[MAC.scala 69:36]
    end
    if (reset) begin // @[MAC.scala 70:37]
      io_macIO_weightTagDelay_REG <= 8'h0; // @[MAC.scala 70:37]
    end else begin
      io_macIO_weightTagDelay_REG <= _io_macIO_weightTagDelay_T_1; // @[MAC.scala 70:37]
    end
  end
// Register and memory initialization
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
`ifdef FIRRTL_BEFORE_INITIAL
`FIRRTL_BEFORE_INITIAL
`endif
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
  _RAND_0 = {1{`RANDOM}};
  wbuf1 = _RAND_0[7:0];
  _RAND_1 = {1{`RANDOM}};
  wbuf2 = _RAND_1[7:0];
  _RAND_2 = {1{`RANDOM}};
  currentBufferReg = _RAND_2[0:0];
  _RAND_3 = {1{`RANDOM}};
  io_macIO_dataDelay_REG = _RAND_3[7:0];
  _RAND_4 = {1{`RANDOM}};
  io_macIO_switchDelay_REG = _RAND_4[0:0];
  _RAND_5 = {1{`RANDOM}};
  io_macIO_outDelay_REG = _RAND_5[31:0];
  _RAND_6 = {1{`RANDOM}};
  io_macIO_weightDelay_REG = _RAND_6[7:0];
  _RAND_7 = {1{`RANDOM}};
  io_macIO_weightWeDelay_REG = _RAND_7[0:0];
  _RAND_8 = {1{`RANDOM}};
  io_macIO_weightTagDelay_REG = _RAND_8[7:0];
`endif // RANDOMIZE_REG_INIT
  `endif // RANDOMIZE
end // initial
`ifdef FIRRTL_AFTER_INITIAL
`FIRRTL_AFTER_INITIAL
`endif
`endif // SYNTHESIS
endmodule
